// Logger.h
#pragma once
#include <fstream>
#include <queue>
#include <mutex>
#include <thread>
#include <atomic>
#include <condition_variable>
#include <vector>
#include <string>
#include <chrono>
class Logger {
public:
    // 日志级别枚举
    enum class LogLevel {
        DEBUG,      // 调试信息
        INFO,       // 常规信息
        WARNING,    // 警告信息
        ERROR,      // 错误信息
        SECURITY    // 安全审计
    };
    // 单例访问
    static Logger& instance() noexcept;
    // 初始化配置
    static void init(const std::string& filename = "", 
                    LogLevel minLevel = LogLevel::INFO);
    
    // 分级日志接口
    static void log(LogLevel level, const char* format, ...);
    
    // 审计日志专用接口
    static void logAudit(const char* format, ...);
    
    // 关闭日志系统
    static void shutdown();
private:
    // 私有构造/析构
    Logger();
    ~Logger();
    // 禁用拷贝和移动
    Logger(const Logger&) = delete;
    Logger& operator=(const Logger&) = delete;
    Logger(Logger&&) = delete;
    Logger& operator=(Logger&&) = delete;
    // 工作线程函数
    void logWorker();
    
    // 辅助方法
    std::string formatEntry(LogLevel level, const char* message);
    void writeBatch(const std::vector<std::string>& batch);
    void checkRollover();
    void flushRemaining();
    static const char* levelToString(LogLevel level) noexcept;
    // 配置参数
    std::string filename;
    std::atomic<LogLevel> currentLevel;
    std::atomic<bool> shutdownFlag{false};
    // 文件输出流
    std::ofstream logFile;       // 常规日志
    std::ofstream auditFile;     // 审计日志
    // 异步队列
    std::queue<std::string> logQueue;
    constexpr static size_t BATCH_SIZE = 100;     // 批量写入大小
    constexpr static size_t MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB滚动阈值
    // 线程同步
    std::mutex configMutex;      // 配置修改锁
    std::mutex logMutex;         // 日志队列锁
    std::mutex auditMutex;       // 审计文件锁
    std::condition_variable queueCV;
    std::thread worker;
    // 时间控制
    std::chrono::system_clock::time_point lastRolloverCheck;
};